/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package gace.dao;

import gace.logica.Usuario;
import gace.basededatos.Conexion;
import java.sql.PreparedStatement;
import gace.basededatos.Conexion;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

/**
 *
 * @author
 */
public class UsuarioDao {

    Connection conexion;

    public UsuarioDao() throws SQLException{
        this.conexion =  Conexion.getConexion();
    }

    /**
     *
     * @param idusuario --
     * @return Retorna true si el usuario es administrador, si no retorna false.
     */
    public boolean esAdministrador(int idUsuario) throws SQLException{
        String sql = "select * from usuario where idtrabajador = ? and administrador = TRUE";
        PreparedStatement stmt = conexion.prepareStatement(sql);
        stmt.setInt(1, idUsuario);
        ResultSet rs = stmt.executeQuery();
        int numReg = rs.getFetchSize();
        if (numReg == 1)
            return true;
        else
            return false;
    }

    /*
     * Agrega usuario a la bd.
     * @param u1 Objeto de tipo Usuario que representa un registro en la tabla
     * Usuario de la bd.
     */
    public void crearUsuario(Usuario u1) throws SQLException{

        String sqlUsuario = "insert into usuario (nombre, apellidos, direccion, administrador, contrasena)"
                + "values (?, ?, ?, ?, ?)";


        //String autogenColumns[] = {"idreserva"};
        PreparedStatement stmt = conexion.prepareStatement(sqlUsuario);
        stmt.setString(1, u1.getNombre());
        stmt.setString(2, u1.getApellido());
        stmt.setString(3, u1.getDireccion());
        stmt.setBoolean(4, u1.isAdministrador());
        stmt.setString(5, u1.getContrasena());



        stmt.executeUpdate();

        // codigo para obtener el ultimo valor de la(s) llave(s)
        //

        int autoIncKeyFromFunc = -1;
        ResultSet rs = stmt.executeQuery("SELECT LAST_INSERT_ID()");

        if (rs.next()) {
            autoIncKeyFromFunc = rs.getInt(1);
        } else {
            // throw an exception from here
        }

        rs.close();
        u1.setId(autoIncKeyFromFunc);
        System.out.println("Key returned from " +
                       "'SELECT LAST_INSERT_ID()': " +
                       autoIncKeyFromFunc);

        stmt.close();


    }

    /**
     * Elimina un usuario de la bd.
     * @param c1 Objeto de tipo usuario que representa un registro en la tabla
     * Usuario de la bd.
     */
    public void eliminarUsuario(Usuario u1) throws SQLException{
        String sql = "delete from usuario where idtrabajador = ?";
        PreparedStatement stmt = conexion.prepareStatement(sql);
        stmt.setInt(1, u1.getId());
        stmt.execute();
        stmt.close();
    }

    /**
     *
     * @return Los usuarios que existen en la base de datos.
     */
    public ArrayList<Usuario> listarUsuarios() throws SQLException{
        String sql = "select * from usuario";
        PreparedStatement stmt = conexion.prepareStatement(sql);
        ResultSet rs = stmt.executeQuery();
        ArrayList<Usuario> usuarios = new ArrayList<Usuario>();
        while(rs.next()){
            Usuario u1 = new Usuario();
            u1.setId(rs.getInt("idtrabajador"));
            u1.setNombre(rs.getString("nombre"));
            u1.setApellido(rs.getString("apellidos"));
            u1.setDireccion(rs.getString("direccion"));
            u1.setAdministrador(rs.getBoolean("administrador"));
            u1.setContrasena(rs.getString("contrasena"));
            usuarios.add(u1);

        }
        rs.close();
        stmt.close();

        return usuarios;

    }

     /**
     * Obtiene de la base de datos la lista de usuarios con el nombre buscado.
     * @return Una lista con los usuarios que hay en la base de datos.
     * @throws SQLException
     */

      public ArrayList<Usuario> getLista(String nombre) throws SQLException{
        String sql = "select * from usuario where nombre like ?";
        PreparedStatement stmt = this.conexion.prepareStatement(sql);
        stmt.setString(1, nombre);
        ResultSet rs = stmt.executeQuery();
        ArrayList<Usuario> usuarios = new ArrayList<Usuario>();


        while(rs.next()){
             Usuario u1 = new Usuario();
            u1.setId(rs.getInt("idtrabajador"));
            u1.setNombre(rs.getString("nombre"));
            u1.setApellido(rs.getString("apellidos"));
            u1.setDireccion(rs.getString("direccion"));
            u1.setAdministrador(rs.getBoolean("administrador"));
            u1.setContrasena(rs.getString("contrasena"));
            usuarios.add(u1);
        }

        rs.close();
        stmt.close();

        return usuarios;

    }

     /**
     * Modifica un usuario que se encuentre en la base de datos.
     * @param c1 El usuario a modificar.
     * @throws SQLException
     */
    public void modificar(Usuario u1) throws SQLException{
        // Ser prepara la sentencia sql
        String sql = "update usuario set nombre=?, apellidos=?, direccion=?, administrador=?, contrasena=? "
                + "where idtrabajador=?";
        PreparedStatement stmt = conexion.prepareStatement(sql);
        stmt.setString(1, u1.getNombre());
        stmt.setString(2, u1.getApellido());
        stmt.setString(3, u1.getDireccion());
        stmt.setBoolean(4,u1.isAdministrador());
        stmt.setString(5, u1.getContrasena());
        stmt.setInt(6, u1.getId());

        // se ejecuta la sentencia sql definida previamente
        stmt.execute();
        stmt.close();
    }

    public int entrar(String usuario, String contrasena) throws SQLException{
        String sql = "select * from usuario where nombre= ? and contrasena= ?";
        PreparedStatement stmt = this.conexion.prepareStatement(sql);
        stmt.setString(1, usuario);
        stmt.setString(2, contrasena);
        ResultSet rs = stmt.executeQuery();
        rs.last();
        int result = rs.getRow();


        rs.close();
        stmt.close();

        return result;
    }

}
